SharePoint RestAPI更新列表图片列报错:期望PrimitiveValue/StartObject节点
你的错误根源在于图片列的请求体格式完全不符合SharePoint REST API的要求:
- 你用数组
[]包裹了一个转义的JSON字符串,但SharePoint要求图片列的值是一个单独的JSON对象(而非数组) - 不需要把对象序列化成字符串,直接用Swift字典表示即可
修正后的代码
重点修改请求体的image3字段,其他部分保持不变:
// 修正后的请求体 let body: [String: Any] = [ "__metadata": [ "type":"SP.Data.TestListListItem" ], "image3": [ "serverRelativeUrl": "/sites/{siteName}/Lists/TestList/Attachments/20/Reserved_ImageAttachment_testImage.jpg", // 注意补全文件后缀 "type": "thumbnail" ] ] var dataBody = Data() do { dataBody = try JSONSerialization.data(withJSONObject: body, options: []) } catch { print("error") return } // 注意:urlString需要补全完整的站点前缀,比如 https://yourtenant.sharepoint.com/sites/{siteName}/... let urlString = "https://yourtenant.sharepoint.com/sites/{siteName}/_api/web/lists/GetByTitle('TestList')/items(20)" guard let url = URL(string: urlString) else { print("Invalid URL") exit(1) } var request = URLRequest(url: url) request.httpMethod = "POST" request.setValue("Bearer \(accessToken)", forHTTPHeaderField: "Authorization") request.setValue("application/json;odata=verbose", forHTTPHeaderField: "Accept") request.setValue("application/json;odata=verbose", forHTTPHeaderField: "Content-Type") request.setValue("*", forHTTPHeaderField: "If-Match") request.setValue("MERGE", forHTTPHeaderField: "X-HTTP-Method") request.setValue(formDigestValue, forHTTPHeaderField: "X-RequestDigest") request.httpBody = dataBody let task = URLSession.shared.dataTask(with: request) { (data, response, error) in if let error = error { print("Error: \(error)") return } if let data = data { do { let json = try JSONSerialization.jsonObject(with: data, options: []) print("Response: \(json)") // 打印响应方便调试 } catch { print("Error parsing JSON: \(error)") } } } task.resume()
额外注意事项
- 文件后缀:确保
serverRelativeUrl里的文件名包含正确的后缀(如.jpg/.png),否则SharePoint无法识别为图片文件 - 类型名称验证:确认
__metadata.type的SP.Data.TestListListItem是正确的——可以通过发送GET请求到列表项接口,查看返回的__metadata.type字段值 - URL完整性:
urlString必须是完整的HTTPS路径,不能省略站点前缀
内容的提问来源于stack exchange,提问作者Gura
相关产品推荐
相关产品推荐

