Skip to content

Commit b86b36a

Browse files
committed
Merge pull request #202 from clouddxy/master
有关回调
2 parents 817e11e + b8e9f64 commit b86b36a

File tree

2 files changed

+102
-0
lines changed

2 files changed

+102
-0
lines changed

examples/关于回调流程.md

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
一般的上传流程是用户获得上传凭证之后直接将资源上传到七牛空间,然后七牛回返回一个上传成功或者失败的信息,用户业务服务器是不清楚这些信息的,可以参考下面的流程图:
2+
![不设置回调](http://7xkn2v.dl1.z0.glb.clouddn.com/[email protected])
3+
4+
另外一种方式是用户在上传的时候设置回调,则七牛会在用户上传成功后将上传资源的元信息以json格式POST到用户设置的callbackurl,用户业务服务器收到这些信息时可以将其进行保存(比如保存到数据库里面方面查询),但是到这一步并没有结束,用户业务服务器还需要对七牛服务器这次回调做出响应,同样是响应一个json格式的数据给七牛服务器,七牛会将回调的信息返回给上传客户端,流程参考如下:
5+
![设置回调](http://7xkn2v.dl1.z0.glb.clouddn.com/[email protected])
6+
7+
以下是具体回调过程:
8+
1. 上传策略里面设置好callbackurl以及callbackbody,callbackHost和callbackBodyType这两个字段都是可以默认不设置的,关于这两个参数的规则可以参考七牛的上传策略文档:
9+
http://developer.qiniu.com/docs/v6/api/reference/security/put-policy.html
10+
这个例子设置的callbackbody是:
11+
`"hash=$(etag)&key=$(key)&fsize=$(fsize)&mimeType=$(mimeType)"`
12+
13+
2.业务服务器设置接收该回调以及返回json的程序代码,可以参考:
14+
```
15+
public void doPost(HttpServletRequest request, HttpServletResponse response)
16+
throws ServletException, IOException {
17+
18+
response.setContentType("text/html");
19+
PrintWriter out = response.getWriter();
20+
21+
//接收七牛回调过来的内容
22+
String line="";
23+
BufferedReader br=new BufferedReader(new InputStreamReader(request.getInputStream()));
24+
StringBuilder sb = new StringBuilder();
25+
while((line = br.readLine())!=null){
26+
sb.append(line);
27+
}
28+
System.out.println(sb);//打印回调内容
29+
30+
//设置返回给七牛的json格式的数据
31+
JsonObject json=new JsonObject();
32+
json.addProperty("response", "success");
33+
out.println(json.toString());
34+
35+
out.flush();
36+
out.close();
37+
}
38+
```
39+
3.业务服务器可以接收到该回调信息如下:
40+
![业务服务器收到的回调信息](http://7xkn2v.dl1.z0.glb.clouddn.com/[email protected])
41+
42+
客户端上传之后可以看到业务服务器返回的json数据:
43+
![客户端收到的回调信息](http://7xkn2v.dl1.z0.glb.clouddn.com/[email protected])
44+
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
##七牛设置notifyURL没有收到回调
2+
3+
在使用七牛进行数据处理时用户可以使用<persistentId>来主动查询持久化处理的执行状态,具体查询方法是发送一个Get请求:http://api.qiniu.com/status/get/prefop?id=
4+
可以参考:
5+
http://developer.qiniu.com/docs/v6/api/reference/fop/pfop/prefop.html
6+
7+
但是调用查询的成本比较高,还得起脚本实时去遍历查询,如果能回调,就可以省掉这个工作了。
8+
9+
正好七牛这边针对上传预转持续化和触发持续化分别提供persistentNotifyUrl和notifyUrl讲处理结果POST到用户业务服务器,用户那边设置解析打印出处理结果就可以了。
10+
11+
那么问题来了,有的用户在使用过程中出现接受不到处理的结果,这种情况一般都是用户那边自己的问题,那应该怎样处理呢?
12+
1.检查下用户设置的persistentNotifyUrl以及notifyUrl,必须是公网上可以正常进行POST请求并能响应HTTP/1.1 200 OK的有效URL,可以使用curl访问下看是否满足这个条件。
13+
另外,七牛这边发送body格式为Content-Type为"application/json"的POST请求,用户回调服务器需要按照读取流的形式读取请求的body才能获取。
14+
15+
2.如果第一个条件满足的情况,我们可以检测下用户后端设定的接收回调处理的程序是否是正常的,对此,我们可以主动POST一个数据给用户的回调服务器:
16+
eg:curl -vX POST "URL" -d "name=123.jpg"
17+
用户那边如果能够正常打印出该内容,说明用户的接收程序是没有问题的。
18+
19+
3.如果以上条件都没有问题的情况下,应该是用户持续化处理本身的代码是有问题的,应该是用户设置的persistentNotifyUrl或者notifyurl没有设置成功,这个时候我们可以让用户在程序里面调试打印下这个URL的值,或者提供下返回的persistentID我们可以请求下获得ReqID然后在日志机上查询下是否是正确的,比如,之前查到的一个结果如下:
20+
url.Values{"notifyURL":[]string{""}, "force":[]string{""}
21+
这就明显看出用户设置的notifyURL是没有传进去的。
22+
23+
这时,我们可以让用户提供下代码,检查下用户代码参数设置是否是有问题的,因为,**不同的语言对于notifyURL参数的写法是有问题的,比如java里面写法是notifyURL,而PHP里面该字段是notifyUrl**,经排查果然,用户用的是PHP语言,但是里面设置notifyURL字段应该是:
24+
$notifyUrl = 'http://notify.fake.com';
25+
但用户设置的是$notifyURL,参数设置是有问题的
26+
27+
另外,可以参考java中Servlet回调处理的代码:
28+
29+
```
30+
public class notify extends HttpServlet {
31+
32+
public notify() {
33+
super();
34+
}
35+
36+
public void doGet(HttpServletRequest request, HttpServletResponse response)
37+
throws ServletException, IOException {
38+
39+
response.setContentType("text/html");
40+
response.setCharacterEncoding("gb2312");
41+
PrintWriter out = response.getWriter();
42+
43+
44+
request.getInputStream();
45+
46+
String line="";
47+
BufferedReader br=new BufferedReader(new InputStreamReader(
48+
request.getInputStream()));
49+
StringBuilder sb = new StringBuilder();
50+
while((line = br.readLine())!=null){
51+
sb.append(line);
52+
}
53+
System.out.println( sb);
54+
55+
}
56+
}
57+
```
58+

0 commit comments

Comments
 (0)